package com.itheima.service;

import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.constant.MessageConstant;
import com.itheima.dao.PermissionDao;
import com.itheima.dao.RoleDao;
import com.itheima.dao.UserDao;
import com.itheima.entity.PageResult;
import com.itheima.entity.QueryPageBean;
import com.itheima.entity.Result;
import com.itheima.pojo.Permission;
import com.itheima.pojo.Role;

import com.itheima.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author yangzhen
 * @date 2020-01-12 15:49
 */
@Service(interfaceClass = RoleService.class)
@Transactional
public class RoleServiceImpl implements RoleService {
    @Autowired
    private RoleDao roleDao;

    /**
     * 新增用户中回显所有的角色信息
     * @return
     */
    @Override
    public List<Role> findAll() {
      return  roleDao.findAll();
    }

    /**
     * 分页查询角色
     * @param queryPageBean
     * @return
     */
    @Override
    public PageResult findRoleByPage(QueryPageBean queryPageBean) {
//        获取基本参数
        Integer currentPage = queryPageBean.getCurrentPage();
        Integer pageSize = queryPageBean.getPageSize();
        String queryString = queryPageBean.getQueryString();
        PageHelper.startPage(currentPage,pageSize);
//        查找角色
        if (queryString != null && queryString.contains(" ")) {
            queryString = queryString.replaceAll(" ", "");
        }
        Page<Role> page = roleDao.selectRole(queryString);
        return new PageResult(page.getTotal(),page.getResult());
    }

    /**
     * 新增角色
     * @param role
     * @param permissionIds
     * @return
     */
    @Override
    public Result add(Role role, Integer[] permissionIds) {
        //        判断用户是否存在
        Role role1 = roleDao.findExist(role);
        if (role1 != null) {
            return new Result(false, MessageConstant.ADD_ROLE_FAIL, "角色已经存在");
        }
        roleDao.add(role);
//        添加权限和角色的对应关系
        for (Integer permissionId : permissionIds) {
            roleDao.addRele(role.getId(),permissionId);
        }
        return new Result(true, MessageConstant.ADD_ROLE_SUCCESS);
    }
    @Autowired
    private PermissionDao permissionDao;
    /**
     * 回显角色信息
     * @param id
     * @return
     */
    @Override
    public Map findRoleById(Integer id) {
        //       根据角色id查询 角色的基本信息
        Role formData = roleDao.findRoleBaseById(id);
//        查询所有的权限信息
        List<Permission> tableData = permissionDao.findAll();
//        根据角色的id 查询角色对应的权限
        List<Integer> permissionIds =permissionDao.findPermissionIds(id);
        Map<String,Object> map=new HashMap<>();
        map.put("formData",formData);
        map.put("permissionIds",permissionIds);
        map.put("tableData",tableData);
        return map;

    }

    /**
     * 编辑角色
     * @param role
     * @param permissionIds
     */
    @Override
    public void edit(Role role, Integer[] permissionIds) {
        //        编辑角色表
        roleDao.editRole(role);
        if (permissionIds!=null||permissionIds.length>0) {
            //        编辑角色表对应的从属关系
            roleDao.deletePermIds(role.getId());
            for (Integer permissionId: permissionIds) {
                roleDao.addRele(role.getId(), permissionId);
            }
        }
    }
    /**
     * 删除角色
     * @param id
     * @return
     */
    @Override
    public Result dele(Integer id) {
//        判断该角色是否为管理员角色
        Role role = roleDao.findRoleBaseById(id);
        if (role.getKeyword().equals("ROLE_ADMIN")) {
            return new Result(false,MessageConstant.DEL_ROLE_FAIL,"系统管理员不可删");
        }
//        判断角色是否被用户所有关联
        Long count = roleDao.findUserRele(id);
        if (count > 0) {
            return new Result(false,MessageConstant.DEL_ROLE_FAIL,"该角色已被关联");
        }
//        删除角色从属关系
        roleDao.deletePermIds(id);
//        删除角色
        roleDao.deleRole(id);
        return  new Result(true,MessageConstant.DEL_ROLE_SUCCESS);
    }

}
